iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0

今天來到封裝的最後一篇囉

Final

final 為 Java 語言的關鍵字,其特性有下列幾點:

  1. final 修飾宣告的類別不可被繼承。
public final class FinalClass {
    // 不能被繼承
}
  1. final 修飾宣告的方法不可被覆寫。
public class People {
    public final void doSomething() {
        // 不能被子類覆蓋
    }
}
  1. final 修飾宣告的變數不可被修改(如同宣告常數般),變數被初始化並賦值,就無法再更改其值
public final int MAX_VALUE = 100; // 常量,不可更改的值

//final 修飾符可以確保在方法內部不會更改參數的值,這有助於防止意外修改參數。
public void printMessage(final String message) {
  
    System.out.println(message);
}

This

this 可以參考到目前使用中該物件的屬性、方法以及建構子,主要用於消除成員變數和區域變數之間的歧義,以及在建構函數中調用其他建構函數。不過this只能用在方法或建構子中以下是有關 this 的詳細解釋和用法:

  1. 調用其他建構函數

    this() 建構子只能放在第一行!!!

    public class MyClass {
        private int number;
    
        public MyClass() {
            // 調用另一個建構函數並傳遞參數
            this(0); // 調用帶有一個整數參數的建構函數
        }
    
        public MyClass(int number) {
            this.number = number;
        }
    }
    
  2. 在方法中參照呼叫該方法的物件

    public class Dog {
    
       public void jump() {
           System.out.println("正在執行jump方法");
       }
    
       public void run() {
           Dog d = new Dog();
           d.jump();
           System.out.println("正在執行run方法");
       }
    
    }
    
    public class DogDemo {
    
        public static void main(String[] args) {
    
            Dog dog = new Dog();
    
            dog.run();
        }	
    
    }
    

    用這樣的方式確實可以在run()內呼叫jump 方法,但這樣的方式一共就產生了兩個Dog的物件;

    1. 程式建立了一個Dog物件,並使用名為d的參照變數來指向Dog物件
    2. 在DogDemo的main()方法中,程式再次建立了一個Dog物件,並使用名為dog的參照變數來指向該Dog物件

    這樣這邊會產生兩個問題:

    1. run()方法中呼叫到jump()方法是否一定需要一個Dog物件?
    2. 是否一定需要重新增立一個Dog物件?

    第一個問題的答案是YES ! 因為沒有使用static修飾的成員變數和方法都必須使用物件來呼叫

    第二的問題的答案是NO ! 因為當程式呼叫run()方法時,一定會提供一個Dog物件,
    這樣就可以直接使用這個已經存在的Dog物件,不需要在增立

    所以我們只需要把run方法改成以下

    public void run() {
    	this.jump();
    	System.out.println("正在執行run方法");
    }
    

    this 可以代表任何物件,當this 出現在方法中時,他所代表的物件是不確定的,但他所代表的物件只能是當前類別,只有當這個方法被呼叫時,所代表的物件才被確定下來,誰呼叫這個方法,this 就代表誰

在Java中,允許物件的一個成員呼叫另一個成員所以在這邊也可以直接省略this,所以在大部分的時候,一個方法存取該類別中定義的其他方法、成員變數時加不加this的效果一樣

public void run() {
		jump();
		System.out.println("正在執行run方法");
	}
  1. static 修飾的方法不能使用this
對於staic 修飾的方法而言,可以使用類別來直接呼叫該方法,如果在static 修飾的方法中使用this ,這個關鍵字就無法指向合適的物件,所以static 成員不能直接存取非staic 成員!!!
  1. 必須使用this的情況

    局部變數和成員變數同名時,要取用被覆蓋的成員變數

    public class ThisInConstructor {
    
        public int number;
    
        public ThisInConstructor() {
            int number = 0;
    
            this.number = 6;
        }
    
        public static void main(String[] args) {
            System.out.println("number:" + new ThisInConstructor().number);
        }
    }
    
    /*
    結果:
    number:6
    */
    

    由於建構子是直接使用new 關鍵字來呼叫,不是用物件來呼叫,所以this在建構子中代表該建構子正在初始化的物件,上面的程式碼this.number = 6 ; 表示將正在執行初始化的ThisInConstructor物件的number成員變數設為6,這等於該建構子返回的所有物件的number成員變數都等於6

  2. 返回當前物件

    public class ReturnThis {
    
        public int age;
        public ReturnThis grow() {
    
            age++;
            return this;
        }
        public static void main(String[] args) {
            ReturnThis returnThis = new ReturnThis();
            returnThis.grow()
                        .grow()
                        .grow();
            System.out.println("age:" + returnThis.age );
    
        }
    
    }
    /*
    結果:
    age:3
    */
    

多載(Overload)

Java中的一項重要特性:要求是兩同一不同允許在同一個類中定義多個方法具有相同的名稱,但擁有不同的參數列表。這些方法可以有不同的參數數量、類型或順序,編譯器根據調用方法時提供的參數來確定要調用的具體方法,其他部分像是返回類型、修飾詞,與方法多載沒有關係

方法重載的特點

方法重載具有以下特點:

  1. 相同方法名:重載的方法必須具有相同的名稱。
  2. 不同參數列表:重載的方法必須具有不同的參數列表,可以是參數數量、類型或順序的不同組合。
  3. 返回值類型不影響:返回值類型不影響方法重載。重載的方法可以具有相同或不同的返回值類型。
  4. 方法修飾符和訪問修飾符可以不同:重載的方法可以具有不同的訪問修飾符(public、private、protected、default)和方法修飾符(static、final、synchronized等)。
  5. 異常類型不影響:方法重載可以拋出不同的異常類型,但異常類型不能是方法重載的決定性因素。
public class Calculator {
   
    public int add(int a, int b) {
        return a + b;
    }
    public double add(double a, double b) {
        return a + b;
    }
    public int add(int a, int b, int c) {
        return a + b + c;
    }
    public String add(int a, String b) {
        return a + b;
    }
}

今天終於把封裝講完了~明天見拉


上一篇
Day 18 封裝(Encapsulation)III
下一篇
Day 20 多型Polymorphism
系列文
玩轉Java:從基礎打造你的程式超能力30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言